package alibaba.timertask;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.util.Timer;
import java.util.TimerTask;

/**
 * @author ChangLiang
 * @date 2020/4/20
 */
public class ThreadLocalTimerTaskTest {

    private static ThreadLocal<Long> threadLocalCount = ThreadLocal.withInitial(() -> 0L);

    /**
     * 只要其中之一没有捕获抛出的异常，其他任务便会自动终止运行
     *
     * output很奇怪 1 2 3 4 。。。  ThreadLocal没起到相应的作用
     * 原因是：通过查看Timer源码我们可以发现Timer本质上是将所有要进行调度的TimerTask
     * 放进一个根据下次执行时间nextExecutionTime排序的队列中(TaskQueue实例，它最大能存储128个TimerTask)
     * 然后通过一个线程（TimerThread实例）来循环执行此队列中的任务。
     * 因此Timer调度的任务是在一个线程中执行的。
     * 而如果其中某一任务运行时间大于任务间执行间隔，会阻塞后续任务，所以Timer的定时在时间上是不严格的。
     * 而且对于任务执行时出现的异常也没有处理，所以它也是不可靠的。
     */
    @Test
    @DisplayName("test Timer Task")
    public void test() {
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                threadLocalCount.set(threadLocalCount.get() + 1);
                System.out.println("thread 1 -- " + threadLocalCount.get());
            }
        };
        TimerTask timerTask2 = new TimerTask() {
            @Override
            public void run() {
                threadLocalCount.set(threadLocalCount.get() + 1);
                if (threadLocalCount.get().equals(6L)) {
                    int a = 1 / 0;
                }
                System.out.println("thread 2 -- " + threadLocalCount.get());
            }
        };

        Timer timer = new Timer();
        // 天数
        long delay = 0;
        // 秒数
        long period = 1000;
        timer.scheduleAtFixedRate(timerTask, delay, period);
        timer.scheduleAtFixedRate(timerTask2, delay, period);
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
